perm filename MKFONT.FAI[XGP,BGB] blob sn#038142 filedate 1973-05-11 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE MKFONT - MAKE FONT - BGB - 2 FEBRUARY 1973.
C00003 00003	SUBR(MKFONT)------------------------------------------------------
C00005 00004	SUBR(MKGLY2)IMAGE-------------------------------------------------
C00010 00005	SUBR(DAG1)--------------------------------------------------------
C00013 00006	SUBR(FNTPAK,CHAR)--------------------------------------------------
C00015 ENDMK
C⊗;
TITLE MKFONT - MAKE FONT - BGB - 2 FEBRUARY 1973.

INTERNAL MKFONT,ORGPTR,ENDPTR
EXTERNAL SEGFNT,PAK,PAKEND

;VARIABLES GLOBAL TO THE SUBROUTINES OF THIS FILE.

	EXTERN RMIN,RMAX,CMIN,CMAX,FILM
	DECLARE{CMAX2}
	DECLARE{ROWCNT,COLCNT,WRDWID,GSIZE}
	DECLARE{GPTR,ORGPTR,ENDPTR}		;FONT SEGMENT.
;	DECLARE{ORGROW,ORGCOL,ENDROW,ENDCOL}	;GLYPH POSITIONING.
	DECLARE{BITS,BYTCNT}

	$←400000
	O(CORE2,CALLI 400015)
SUBR(MKFONT)------------------------------------------------------
BEGIN MKFONT; MAKE FONT - BGB - 2 FEBRUARY 1973.
	EXTERN CTRL,META,SHRINK
	MOVE CTRL↔AND META↔JUMPN L0		;CONTINUE FONT.
	SETZM HFLAG↔SKIPE CTRL↔SETOM HFLAG

;CREATE FONT SEGMENT.
	CALL(SEGFNT)				;GET AN UPPER SEGMENT
;	SETZ↔CORE2↔HALT
	MOVEI $+1777↔MOVEM ENDPTR
;	CORE2↔HALT				;MAKE UPPER SEG.
	SETZM $↔MOVE[XWD $,$+1]↔BLT $+1777	;CLEAR FONT SPACE.
;	MOVE[SIXBIT/FONT/]↔CALLI $+36↔JFCL	;NAME UPPER SEG.
	MOVEI $+400↔MOVEM ORGPTR
	OUTSTR[ASCIZ/FONT DESCRIPTION (ONE LINE):/]
	TTYUUO 14,				;WAIT FOR LINE TO BE TYPED
	MOVEI $+240
	DDTIN
L0:	SETZM CTRL↔SETZM META
	MOVE 1,FILM↔SON 1,1↔SKIPN 1↔POP0J	;IMAGE.
	MOVEM 1,IMAGE0↔MOVEM 1,IMAGE1↔GO L2

;CREATE A GLYPH FOREACH IMAGE OF THE FILM.
L1:	EXTERN NEXIMG↔CALL(NEXIMG)
	MOVE 1,FILM↔SON 1,1↔MOVEM 1,IMAGE1
	CAMN 1,IMAGE0↔GO L3
L2:	EXTERN REGION↔CALL(REGION)
	CALL(MKGLY2,IMAGE1)
	CALL(DAG1)↔GO L1	;ONE INTO ONE.

L3:	SETZM RMIN↔SETZM RMAX
	EXTERN DPYPAK↔CALL(DPYPAK)
	OUTSTR[ASCIZ/	END OF MAKE FONT.
/]↔	CALL(SHRINK)
	POP0J

	DECLARE{IMAGE0,IMAGE1}

↑HFLAG:	0
BEND;2/2/73-------------------------------------------------------
SUBR(MKGLY2)IMAGE-------------------------------------------------
BEGIN MKGLY2;ALLOCATE GLYPH SPACE AND DIMENSIONS.

	ACCUMULATORS{A,B,LVL}
	MOVE 1,ARG1
	SON LVL,1
	PGON 0,LVL↔ADDI 0,40↔ANDCMI 0,77
	ASH 0,-6↔MOVEM 0,WIDTH#			;OPTIONAL WIDTH
	NCNT A,LVL				;ASCII CODE.
	CAIGE A,200↔SKIPG A
	GO[OUTSTR[ASCIZ/	CHARACTER = /]
		INCHRW A↔NCNT. A,LVL↔CRLF↔GO .+1]

;PLACE GLYPH POINTER INTO ASCII TABLE.

	MOVEM A,CHAR
	MOVE B,ORGPTR
	TRZ B,$
	SKIPE $(A)
	GO [ OUTSTR[ASCIZ/DUPLICATE CHARACTER: '/]
	     OUTCHR A	
	     OUTSTR[ASCIZ/'.  GLYPH SKIPPED.
/]
	     AOS(P)
	     POP1J]
	OUTCHR A
	MOVEM B,$(A)

;COMPUTE GLYPH DIMENSIONS.
	
	MOVEI =144↔CAMG CMIN
	GO [ MOVEM CMIN
	     GO C0]
	OUTSTR[ASCIZ/ WAS MOVED RIGHT.	/]
	MOVE CMIN↔SETZM WIDFLG#
C0:	ADD WIDTH
	CAML CMAX↔GO [ MOVEM CMAX
		       SETOM WIDFLG
		       SKIPN CMAX
		       SKIPE RMAX
		       GO .+1
		       MOVEI 2
		       MOVEM GSIZE 
		       SETZM ROWCNT
		       POP1J ]
	MOVE RMAX↔SUB RMIN↔AOS		;CALCULATE ROW COUNT
	SKIPGE 0↔SETZ 0,
	SKIPN HFLAG↔GO M1
	TRNE 1↔AOS↔ASH -1
M1:	MOVEM ROWCNT
	MOVE CMAX↔SUB CMIN↔AOS		;CALCULATE REAL COLUMN COUNT
	SKIPGE 0↔SETZ 0,
	SKIPN HFLAG↔GO M2
	TRNE 1↔AOS↔ASH -1
M2:	MOVEM COLCNT

;	IDIVI =36↔SKIPE 1↔AOS↔MOVEM WRDWID
;	MOVE WRDWID↔IMUL ROWCNT↔ADDI 3↔MOVEM GSIZE
  
;	MOVE WRDWID↔IMULI =72↔ADD CMIN↔SOS↔MOVEM CMAX2
;	MOVE WRDWID↔IMULI =36↔SKIPE HFLAG↔IMULI 2↔ADD CMIN↔SOS↔MOVEM CMAX2
	MOVE COLCNT
	SKIPE WIDFLG↔GO[HRLZ 0,0↔GO .+3]	;IF WIDTH IS DEFINED, USE IT
	ADDI 1↔	IMUL [1040000]			;OTHERWISE, ADD SOME SPACING
	MOVE A,CHAR↔HLLM 0,$(A)			;UPDATE TABLE ENTRY
	HLRZ 0,0↔MOVEM COLCNT
	SKIPE HFLAG↔IMULI 2↔ADD CMIN↔SOS↔MOVEM CMAX2	;FIND LAST COLUMN
	MOVE COLCNT↔IDIVI =36↔SKIPE 1↔AOS↔MOVEM WRDWID	;AND WORD WIDTH
	MOVEI =36↔IDIV COLCNT			;NUMBER OF BYTES PER WORD
	SKIPN 0↔MOVEI 1↔MOVEM BYTCNT	;IF MORE THAN 1 WORDS/BYTE, SET TO 1
	MOVE ROWCNT↔IMUL WRDWID↔SOS↔IDIV BYTCNT↔AOS	;GLYPH WORD COUNT
	ADDI 2↔MOVEM GSIZE			;PLUS 2 FOR DESCRIPTOR
	MOVE BYTCNT↔IMUL COLCNT↔MOVEM BITS	;NUMBER OF BITS USED IN WORD

;COMPUTE GLYPH POSITION.

;	MOVE ROWCNT↔MOVEM ENDROW
;	MOVE ROWCNT↔MOVNM ORGROW
;	SETZM ORGCOL
;	MOVE COLCNT↔ADDI 5↔MOVEM ENDCOL

;UPDATE ORG POINTER AND EXPAND FONT SPACE WHEN NECESSARY.

	MOVE ORGPTR↔MOVEM GPTR
	ADD GSIZE↔MOVEM ORGPTR
	CAMG ENDPTR↔POP1J
	MOVE ENDPTR↔ADDI 2000↔MOVEM ENDPTR
	CORE2↔GO[FATAL({FONT SPACE EXHAUTED.})]
	MOVE ENDPTR↔SUBI 1777↔SETZM@↔HRLM↔AOS
	MOVE 1,ENDPTR↔BLT(1)↔POP1J

BEND;2/2/73-------------------------------------------------------
CHAR:	0
SUBR(DAG1)--------------------------------------------------------
BEGIN DAG1;DEPOSIT GLYPH INTO FONT - 1 FOR 1 - BGB - 2 FEB 1973.
	EXTERN PAKPTR
	ACCUMULATORS{R,C,G,PTR,GLY,CNT,BCNT}
	MOVE G,GPTR		;GLYPH POINTER.
;HEADER.
;	MOVE ROWCNT↔HRLM 0(G)	;ROW COUNT.
;	MOVE WRDWID↔HRRM 0(G)	;WORD WIDTH.
;	MOVE ORGROW↔HRLM 1(G)	;ORIGIN VECTOR.
;	MOVE ORGCOL↔HRRM 1(G)
;	MOVE ENDROW↔HRLM 2(G)	;END VECTOR.
;	MOVE ENDCOL↔HRRM 2(G)
	MOVE GSIZE↔HRL CHAR↔MOVEM 0(G)
	MOVE RMIN↔SKIPN RMAX↔MOVEI =108
	SKIPN HFLAG↔GO H1
	SOS↔ASH -1↔ADDI 1+=54
H1:	SUBI 1↔HRL ROWCNT↔MOVSM 1(G)
	MOVE 0,GSIZE↔CAIN 0,2↔POP0J	;QUICK EXIT FOR BLANK CHARACTERS

;MOVE BIT ARRAY INTO GLYPH.

	MOVE GLY,[POINT 1,0,-1]
	ADDI GLY,2(G)
	MOVE R,RMIN
	SKIPE HFLAG
	GO M0+1
	GO L0+1
L0:	TLZ GLY,770000		;FORCE WORD BOUNDARY
	MOVE BCNT,BITS		;SET BITS USED IN WORD
L1:	MOVE C,CMIN↔LSH R,3	;1 FOR 1
L2:	LDB PAKPTR(C)		;DOUBLE INDEXED BY (R).
	IDPB GLY
	AOS C
	CAMG C,CMAX2↔GO L2
	LSH R,-3↔AOS R
;	CAMG R,RMAX↔GO L1
;	POP0J
	CAMLE R,RMAX
	POP0J
	SUB BCNT,COLCNT		;SUBTRACT BITS USED IN THIS WORD(S)
	JUMPG BCNT,L1		;CONTINUE THIS WORD IF MORE BITS LEFT
	GO L0			;START NEW WORD

M0:	TLZ GLY,770000		;FORCE WORD BOUNDARY
	MOVE BCNT,BITS		;SET BITS USED IN WORD
M1:	MOVE C,CMIN↔LSH R,3	;4 INTO 1
M2:	SETZ CNT,
	LDB PAKPTR(C)↔SKIPE↔AOS CNT↔AOS C
	LDB PAKPTR(C)↔SKIPE↔AOS CNT↔SOS C↔ADDI R,8
	LDB PAKPTR(C)↔SKIPE↔AOS CNT↔AOS C
	LDB PAKPTR(C)↔SKIPE↔AOS CNT↔AOS C↔SUBI R,8
	SETZ↔CAILE CNT,1↔SETO↔IDPB GLY
	CAMG C,CMAX2↔GO M2
	LSH R,-3↔AOS R↔AOS R
;	CAMG R,RMAX↔GO M1
;	POP0J
	CAMLE R,RMAX
	POP0J
	SUB BCNT,COLCNT		;SUBTRACT BITS USED IN THIS WORD
	JUMPG BCNT,M1		;CONTINUE THIS WORD IF MORE BITS LEFT
	GO M0			;START NEW WORD
BEND;2/2/73-------------------------------------------------------
SUBR(FNTPAK,CHAR)--------------------------------------------------
BEGIN FNTPAK
	ACCUMULATORS{T1,ADR,ROWS}
	CALL(SEGFNT)
	MOVE 1,ARG1
	SKIPG ADR,$(1)
	POP1J
	HLRZ 0,$(ADR)
	CAME 0,1
	GO [ FATAL(INVALID FONT FILE) ]
	MOVE ROWS,[XWD ACCODE,ROWS+1]
	BLT ROWS,LASTAC
	MOVE ROWS,[XWD PAK,PAK+1]
	SETZM PAK
	BLT ROWS,PAKEND
	HLRE 0,ADR
	MOVE T1,0
	IDIVI 0,44
	HRRZ ADR,ADR
	ADD ADR,[XWD 004400,$+1]
	SKIPN 0
	DPB 1,[POINT 6,ADR,11]
	SKIPE 1
	ADDI 0,1
	HRRM 0,WWLOC
	MOVN 0,0
	ADDI 0,=288/=36
	HRRM 0,INCLOC
	HLRE 1,(ADR)
	SUB 1,$+203
	ADDI 1,=216/=2
	MOVEM 1,RMIN
	IMULI 1,=288/=36
	ADDI 1,PAK+=288/=72-1
	HLL 1,ADR
	ADDI T1,=288/=2-1
	MOVEM T1,CMAX
	MOVEI T1,=288/=2
	MOVEM T1,CMIN
	MOVE T1,RMIN
	ADD T1,(ADR)
	HRRZM T1,RMAX
	HRRZ ROWS,(ADR)
	AOS (P)
	GO ACGO
ACCODE:	PHASE ROWS+1
WWLOC:	MOVEI 0,0		;WORD WIDTH GOES HERE
	ILDB T1,ADR
	IDPB T1,1
	SOJG 0,.-2
INCLOC:	ADDI 1,0		;PAK ROW INCREMENT GOES HERE
	TLZ 1,770000
ACGO:	SOJGE ROWS,WWLOC
	DETSEG
LASTAC:	POP1J
	DEPHASE
BEND FNTPAK

END